
#ifndef _QUESTION_H
#define _QUESTION_H

/**
 * @file Question.h
 * @brief Contient la structure Question et ses fonctions
 * @details liste des fonctions pour le module Question
 * @version 1.0
 * @date 2013/05/16
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <assert.h>
#include <time.h>
#include <malloc.h>

/**
 * @struct Reponse structure reponse
 * @brief Structure Reponse
 * @details	la structure contient: une chaine de caractère pour la reponse et un booleen pour vrai ou faux ou vide.
 * @param rep pour l'enoncer de la reponse
 * @param VF reponse juste ou fausse.
*/
typedef struct
{
    char * rep;
	bool VF;
} Reponse;
/**
 * @struct Question structure Question
 * @brief Structure Question
 * @details	la structure contient: un enum avec 3 types pour la reponse, deux chaines de caractères pour la reponse et la Quest de la Question ,un tableau de 4 reponses.
 * @param Quest pour l'enoncer de la question
 * @param tabRep pour les 4 reponses possibles (une vrai et 3 fausses).
*/
typedef struct
{
    char * Quest;
	Reponse ** tabRep;
} Question;

/**
 * @brief alloue une question et fais appel a initQuestion.
 * @param void
 * @return Question* pointeur sur question
*/
Question * creerQuestion();
/**
 * @brief alloue une chaine de caractere pour Quest et un tableau de 4 reponses .
 * @param [in-out] Question* pointeur sur question
 * @return void
*/
void initQuestion(Question *);
/**
 * @brief initialise VF à "vide" et alloue une chaine de caractere pour rep.
 * @param [in-out] Reponse* pointeur sur reponse
 * @return void
*/
void initReponse(Reponse *);
/**
 * @brief alloue une reponse et fais appel a initReponse.
 * @param void
 * @return Reponse* pointeur sur reponse
*/
Reponse * creerReponse();
/**
 * @brief detruireQuest fais appel a libereQuest et met le pointeur a NULL.
 * @param [in-out] Question** pointeur sur pointeur sur question
 * @return void
*/
void detruitQuestion(Question ** CC);
/**
 * @brief libereQuest fais appel a libereRep jusqu'a vider le tableau.
 * @param [in-out] Question* pointeur sur question
 * @return void
*/
void libereQuestion(Question *);
/**
 * @brief libereRep fais un free sur Rep->rep.
 * @param [in-out] Reponse* pointeur sur reponse
 * @return void
*/
void libereRep(Reponse *);
/**
 * @brief detruireReponse fais appel a libereReponse et met le pointeur a NULL.
 * @param [in-out] Reponse** pointeur sur pointeur sur reponse
 * @return void
*/
void detruitReponse(Reponse **);

/**
 * @brief setQuest mutateur pour modifier la Quest de la question.
 * @param [in-out] Question* pointeur sur question
 * @param [in] char* pointeur sur chaine de caractere.
 * @return void
*/
void setQuest(Question *, const char *);
/**
 * @brief setRep mutateur pour modifier la Rep de la reponse.
 * @param [in-out] Reponse* pointeur sur reponse .
 * @param [in] char * pointeur sur chaine de caractere.
 * @param [in] bool booleen (faux,vrai,vide)
 * @return void
*/
void setRep(Reponse *, const char *, const bool);
/**
 * @brief setRepQuest mutateur pour modifier les reponses de la question.
 * @param [in-out] Question* pointeur sur question
 * @param [in] char * pointeur sur chaine de caractere.
 * @return void
*/
void setRepQuest(Question *, const char *);
/**
 * @brief getQuest accesseur pour acceder a la Quest de la question.
 * @param [in] Question* pointeur sur question
 * @return char * pointeur sur chaine de caractere.
*/
char * getQuest(const Question *);
/**
 * @brief getRep accesseur pour acceder a la Rep de la reponse.
 * @param [in] Reponse* pointeur sur reponse
 * @return char * pointeur sur chaine de caractere.
*/
char * getRep(const Reponse *);
/**
 * @brief getVF accesseur pour acceder a VF de la reponse
 * @param [in] Reponse* pointeur sur reponse
 * @return bool booleen
*/
bool getVF(const Reponse *);
/**
 * @brief getRepJuste accesseur pour acceder a la Reponse juste d'une question.
 * @param [in] Question* pointeur sur une question
 * @return char * pointeur sur chaine de caractere.
*/
char * getRepJuste(const Question *);
/**
 * @brief melange le tableau de reponse.
 * @param [in-out] Question* pointeur sur question
 * @return void
*/
void repartirReponseAlea(Question *);


#endif
